package net.sudot.chess.util;

import net.sudot.commons.utils.ConfigUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Random;
import java.util.regex.Pattern;

/**
 * 短信接口,对短信接口地址进行拼接,提供公用
 * <pre>
 *     亿美平台不再使用 by tangjialin on 2017-03-24
 *     添加新的梦网通道[192.168.10.204:8082] by tangjialin on 2017-10-12
 * </pre>
 *
 * @author tangjialin on 2017-01-11 0011.
 */
public class SMSUtil {
    /** 短信发送模版 */
//	private static final String TEXT_TEMPLATE = ConfigConsts.SMS_SEND_SIGN_TEXT_TEMPLATE;
    private static final Pattern VERIFY_CODE_PATTERN = Pattern.compile("#VERIFY_CODE#");
    /** 短信服务主机地址 */
    private static final String SMS_TOKEN_HOST = ConfigUtils.getConfigValue("SMS_TOKEN_HOST");
    /** Token存储KEY */
    private static final String TOKEN_KEY = (SMSUtil.class.getName() + ":token").replaceAll("\\.", ":");
    /** Token请求接口 */
    private static final String GET_TOKEN_API = SMS_TOKEN_HOST + "/api/getToken";
    /** 短信发送接口 */
    private static final String SEND_MASSEGE_API = SMS_TOKEN_HOST + "/api/sendMessage";
    public static Logger logger = LoggerFactory.getLogger(SMSUtil.class);
//	/** Redis操作工具 */
//	private static RedisTemplate<String, Object> redisTemplate;

//	static {
//		try {
//			WebApplicationContext applicationContext = ContextLoader.getCurrentWebApplicationContext();
//			redisTemplate = applicationContext.getBean(ConfigConsts.REDIS_SERVER_NAME, RedisTemplate.class);
//		} catch (Throwable e) {
//			logger.error("短信服务加载失败", e);
//		}
//	}

    public SMSUtil() {
    }

    /**
     * 生成指定长度的纯数字字符串
     *
     * @param len 指定生成的长度
     * @return 返回生成的字符串
     */
    public static String getRandomCode(int len) {
        Random random = new Random();
        StringBuilder sb = new StringBuilder(len);
        for (int index = 0; index < len; index++) {
            sb.append(random.nextInt(10));
        }
        return sb.toString();
    }

//	/**
//	 * 发送短信接口
//	 * <pre>
//	 * 请求包示例：
//	 * {
//	 * "content": "【联金所】xxx你好….",	//短信内容，需要发送的短信内容
//	 * "identityId": "800001",		//应用标识，短信系统分配
//	 * "msgCode": "800001xx",		//短信编号，生成策略见参数说明
//	 * "msgTypeId": "1",			//短信类型，各短信类型见参数说明
//	 * "phone": "15112345678",		//接收手机号码
//	 * "token": " 876eec00-4054-46e3-9e68-2d17d3d328d4"	//token值
//	 * }
//	 * 返回结果
//	 * {
//	 * "success":"true",			//短信是否发送成功
//	 * "code":"200",				//错误状态码
//	 * "message":"发送成功"			//错误信息
//	 * }
//	 *
//	 * 注：如果返回false且code为40002，请重新请求token
//	 *
//	 * 200			请求成功
//	 * 400			请求失败
//	 * 500			短信系统内部错误
//	 * 600			路由配置错误
//	 * 700			服务商Bean配置错误
//	 * 40001		请求参数错误
//	 * 40002		TOKEN无效
//	 * 41001		账号或密码错误
//	 * 41002		账号无效
//	 * 45001		ip地址无效，拒绝发送短信
//	 * 45002		违反安全防护策略，拒绝发送短信
//	 * 48001		调用第三方接口错误
//	 * </pre>
//	 *
//	 * @param content 内容
//	 * @param phones  电话号码,多个用；隔开
//	 * @param channel 发送通道
//	 * @param msgCode 短信编号(应用标识 + 年月日时分秒毫秒 + 十位随机数)
//	 * @param level   短信发送失败重试次数
//	 * @return
//	 */
//	private static MsgResponse sendSms(String content, String phones, SMSChannel channel, String msgCode, int level) {
//		if (content == null || phones == null || channel == null) { return new MsgResponse(); }
//		String response = null;
//		try {
//			MsgResponse token = getToken(channel);
//			if (!token.isSuccess()) { return token; }
//			Map<String, Object> map = new HashMap<>();
//			map.put("content", content);
//			map.put("identityId", channel.getIdentityId());
//			map.put("msgCode", msgCode);
//			map.put("msgTypeId", 1);
//			map.put("phone", phones);
//			map.put("token", token.getMessage());
//			response = HttpUtils.json.sendPost(SEND_MASSEGE_API, JSONUtil.toJSONString(map));
//		} finally {
//			if (logger.isInfoEnabled()) {
//				logger.info("发送短信,通道:{}, 手机:{}, 短信内容:{} 响应内容:{}", channel.getRemark(), phones, content, response);
//			}
//		}
//		MsgResponse msgResponse = JSONUtil.toBean(response, MsgResponse.class);
//		if (40002 == msgResponse.getCode()) {
//			refreshToken(channel);
//			if (level > 0) {
//				return sendSms(content, phones, channel, msgCode, level - 1);
//			}
//		}
//		return msgResponse;
//	}
//
//	/**
//	 * 发送手机验证码
//	 *
//	 * @param verifyCode 验证码
//	 * @param phones     手机号码
//	 * @param channel    渠道
//	 * @param msgCode    短信编号(应用标识 + 年月日时分秒毫秒 + 十位随机数)
//	 * @return
//	 */
//	public static MsgResponse sendVerifyCode(String verifyCode, String phones, SMSChannel channel, String msgCode) {
//		String content = VERIFY_CODE_PATTERN.matcher(TEXT_TEMPLATE).replaceAll(verifyCode);
//		return sendSms(content, phones, channel, msgCode, 2);
//	}
//
//	/**
//	 * 获取Token信息
//	 *
//	 * @param channel 渠道
//	 * @return 返回Token值
//	 */
//	private static MsgResponse getToken(SMSChannel channel) {
//		if (redisTemplate != null) {
//			HashOperations<String, Object, Object> opsForHash = redisTemplate.opsForHash();
//			String token = (String) opsForHash.find(TOKEN_KEY, channel.name());
//			if (token != null) {
//				return new MsgResponse(true).setMessage(token);
//			}
//		}
//		return refreshToken(channel);
//	}
//
//	/**
//	 * 重新获取Token信息
//	 *
//	 * @param channel 渠道
//	 * @return 返回Token值
//	 */
//	private static MsgResponse refreshToken(SMSChannel channel) {
//		Map<String, String> map = new HashMap<>(2);
//		map.put("identityId", channel.getIdentityId());
//		map.put("password", channel.getPassword());
//		String response = HttpUtils.json.sendPost(GET_TOKEN_API, JSONUtil.toJSONString(map));
//		MsgResponse msgResponse = JSONUtil.toBean(response, MsgResponse.class);
//		if (msgResponse.isSuccess()) {
//			if (redisTemplate != null) {
//				HashOperations<String, Object, Object> opsForHash = redisTemplate.opsForHash();
//				if (opsForHash != null) {
//					opsForHash.put(TOKEN_KEY, channel.name(), msgResponse.getMessage());
//				}
//			}
//		}
//		return msgResponse;
//	}

    /**
     * 生成短信编号(应用标识 + 年月日时分秒毫秒 + 十位随机数)
     *
     * @param channel 渠道
     * @return 返回生成的字符串
     */
    public static String getMsgCode(SMSChannel channel) {
        StringBuilder builder = new StringBuilder(33);
        builder.append(channel.getIdentityId()).append(System.currentTimeMillis()).append(getRandomCode(10));
        return builder.toString();
    }

    public enum SMSChannel {
        MONTERNET("通道一", "移动梦网", ConfigUtils.getConfigValue("SMS_SEND_IDENTITYID_MONTERNET"), ConfigUtils.getConfigValue("SMS_SEND_PASSWORD_MONTERNET")),
        QIAN_XUN("通道二", "千讯", ConfigUtils.getConfigValue("SMS_SEND_IDENTITYID_QIAN_XUN"), ConfigUtils.getConfigValue("SMS_SEND_PASSWORD_QIAN_XUN"));
        private String name;
        private String remark;
        private String identityId;
        private String password;

        SMSChannel(String name, String remark, String identityId, String password) {
            this.name = name;
            this.remark = remark;
            this.identityId = identityId;
            this.password = password;
        }

        public String getName() {
            return name;
        }

        public String getRemark() {
            return remark;
        }

        public String getIdentityId() {
            return identityId;
        }

        public String getPassword() {
            return password;
        }
    }
}